Skill

Kotlin এ Object-Oriented Programming (OOP)

Mobile App Development - কটলিন (Kotlin)
394

Kotlin এ Object-Oriented Programming (OOP)

কটলিন একটি Object-Oriented Programming (OOP) সমর্থিত ভাষা। এতে ক্লাস, অবজেক্ট, ইনহেরিটেন্স, পলিমরফিজম, অ্যাবস্ট্রাকশন, এবং এনক্যাপসুলেশন সম্পূর্ণভাবে সমর্থিত। OOP-এর মাধ্যমে প্রোগ্রামিং আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রিডেবল হয়। নিচে কটলিনে OOP সম্পর্কিত গুরুত্বপূর্ণ বিষয়গুলো আলোচনা করা হলো:


১. ক্লাস এবং অবজেক্ট (Class and Object)

ক্লাস হলো কটলিনে একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরির জন্য ব্যবহৃত হয়। অবজেক্ট হলো ক্লাসের ইনস্ট্যান্স, যা ক্লাসের প্রোপার্টি এবং মেথডগুলো ব্যবহার করতে পারে।

i) ক্লাস ডিক্লারেশন

class Person(val name: String, var age: Int) {
    fun greet() {
        println("Hello, my name is $name and I am $age years old.")
    }
}

ব্যাখ্যা:

  • class Person দিয়ে একটি ক্লাস ডিক্লেয়ার করা হয়েছে।
  • ক্লাসটির দুটি প্রোপার্টি (name এবং age) রয়েছে, একটি val (immutable) এবং একটি var (mutable)।
  • greet() হলো একটি মেথড যা ক্লাসের প্রোপার্টি ব্যবহার করে একটি মেসেজ প্রিন্ট করে।

ii) অবজেক্ট তৈরি করা

fun main() {
    val person = Person("Alice", 30)
    person.greet() // আউটপুট: Hello, my name is Alice and I am 30 years old.
}
  • এখানে Person ক্লাস থেকে একটি অবজেক্ট তৈরি করা হয়েছে, এবং greet() মেথডটি কল করা হয়েছে।

২. কন্সট্রাক্টর (Constructor)

কটলিনে ক্লাসে প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টর থাকতে পারে। প্রাইমারি কন্সট্রাক্টরটি ক্লাসের ডিক্লারেশন লাইনে থাকে, আর সেকেন্ডারি কন্সট্রাক্টর ক্লাস বডিতে থাকে।

i) প্রাইমারি কন্সট্রাক্টর

class Car(val brand: String, val model: String, var year: Int)

ব্যাখ্যা:

  • এখানে Car ক্লাসে প্রাইমারি কন্সট্রাক্টরের মাধ্যমে তিনটি প্রোপার্টি সেট করা হয়েছে।

ii) সেকেন্ডারি কন্সট্রাক্টর

class Car {
    var brand: String
    var model: String
    var year: Int

    constructor(brand: String, model: String, year: Int) {
        this.brand = brand
        this.model = model
        this.year = year
    }
}
  • এখানে সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করে প্রোপার্টি ইনিশিয়ালাইজ করা হয়েছে।

৩. ইনহেরিটেন্স (Inheritance)

কটলিনে ইনহেরিটেন্স একটি ক্লাসের মধ্যে বৈশিষ্ট্য পুনরায় ব্যবহার করতে দেয়। কটলিনে ক্লাসগুলো ডিফল্টভাবে final থাকে, তাই এগুলোকে ইনহেরিট করতে চাইলে open কীওয়ার্ড ব্যবহার করতে হয়।

উদাহরণ:

open class Animal(val name: String) {
    open fun sound() {
        println("Animal sound")
    }
}

class Dog(name: String) : Animal(name) {
    override fun sound() {
        println("Bark")
    }
}

ব্যাখ্যা:

  • Animal হলো একটি বেস ক্লাস যা open কীওয়ার্ড দিয়ে ডিক্লেয়ার করা হয়েছে।
  • sound() মেথডটিও open, যাতে সাবক্লাস এটি ওভাররাইড করতে পারে।
  • Dog ক্লাসটি Animal ক্লাস থেকে ইনহেরিট করে এবং sound() মেথড ওভাররাইড করে।

৪. পলিমরফিজম (Polymorphism)

পলিমরফিজম ইনহেরিট করা ক্লাসগুলোতে মেথড বা ফাংশন ওভাররাইড করার মাধ্যমে কাজ করে। এটি ক্লাসের বিভিন্ন ফর্ম বা রূপ তৈরি করতে সাহায্য করে।

উদাহরণ:

fun main() {
    val animal: Animal = Dog("Rex")
    animal.sound() // আউটপুট: Bark
}
  • এখানে, animal ভ্যারিয়েবলটি Animal টাইপ হলেও এটি Dog ক্লাসের ইনস্ট্যান্স ধারণ করে। এটি Dog ক্লাসের sound() মেথড এক্সিকিউট করে।

৫. অ্যাবস্ট্রাকশন (Abstraction)

কটলিনে অ্যাবস্ট্রাকশন তৈরি করার জন্য abstract ক্লাস ব্যবহার করা হয়। abstract ক্লাসে abstract মেথড থাকতে পারে, যা সাবক্লাসে ইমপ্লিমেন্ট করতে হয়।

উদাহরণ:

abstract class Vehicle {
    abstract fun start()
}

class Bike : Vehicle() {
    override fun start() {
        println("Bike started")
    }
}

ব্যাখ্যা:

  • Vehicle হলো একটি abstract ক্লাস, যেখানে start() মেথডটি abstract হিসেবে ডিক্লেয়ার করা হয়েছে।
  • Bike ক্লাসটি Vehicle ক্লাস ইনহেরিট করে এবং start() মেথড ইমপ্লিমেন্ট করে।

৬. এনক্যাপসুলেশন (Encapsulation)

এনক্যাপসুলেশন হলো প্রোপার্টি এবং মেথডগুলোকে একটি ক্লাসের মধ্যে আবদ্ধ করে রাখা, যাতে বাইরের ক্লাস সরাসরি এগুলোর এক্সেস না পায়। কটলিনে ভিজিবিলিটি মডিফায়ার ব্যবহার করে এনক্যাপসুলেশন নিশ্চিত করা যায়।

ভিজিবিলিটি মডিফায়ার:

  • public: ডিফল্ট ভ্যালু, যা সর্বত্র অ্যাক্সেসযোগ্য।
  • private: শুধুমাত্র সেই ক্লাসের মধ্যেই অ্যাক্সেসযোগ্য।
  • protected: শুধুমাত্র সেই ক্লাস এবং সাবক্লাসে অ্যাক্সেসযোগ্য।
  • internal: মডিউল-লেভেল অ্যাক্সেস।

উদাহরণ:

class Account {
    private var balance: Double = 0.0

    fun deposit(amount: Double) {
        if (amount > 0) {
            balance += amount
        }
    }

    fun getBalance(): Double {
        return balance
    }
}

ব্যাখ্যা:

  • balance ভ্যারিয়েবলটি private, তাই এটি ক্লাসের বাইরে থেকে সরাসরি এক্সেসযোগ্য নয়।
  • deposit() এবং getBalance() মেথড ব্যবহার করে balance ভ্যারিয়েবলের মান পরিবর্তন এবং রিট্রিভ করা যায়।

উপসংহার

কটলিনে OOP কনসেপ্টগুলো (ক্লাস, ইনহেরিটেন্স, পলিমরফিজম, অ্যাবস্ট্রাকশন, এবং এনক্যাপসুলেশন) সহজ এবং কার্যকর উপায়ে ইমপ্লিমেন্ট করা যায়। OOP কনসেপ্ট ব্যবহার করে কোড আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রিডেবল হয়।

Content added By

Classes এবং Objects

340

Classes এবং Objects

কটলিনে Classes এবং Objects হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূল ভিত্তি। ক্লাস হলো একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়, আর অবজেক্ট হলো সেই ক্লাসের একটি নির্দিষ্ট ইন্সট্যান্স। কটলিনে ক্লাস এবং অবজেক্ট তৈরি করা এবং পরিচালনা করা বেশ সহজ এবং সিম্পল। নিচে ক্লাস এবং অবজেক্ট নিয়ে বিস্তারিত আলোচনা করা হলো:


১. ক্লাস (Class)

ক্লাস হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট যা ডেটা এবং ফাংশন (মেথড) ধারণ করে। এর মাধ্যমে আপনি একটি নির্দিষ্ট ডেটা টাইপ এবং তার সাথে সম্পর্কিত অপারেশনগুলো নির্ধারণ করতে পারেন।

i) ক্লাস ডিক্লারেশন

কটলিনে একটি ক্লাস ডিক্লারেশন করতে class কীওয়ার্ড ব্যবহার করা হয়।

উদাহরণ:

class Person {
    // প্রোপার্টিজ
    var name: String = ""
    var age: Int = 0

    // মেথড
    fun displayInfo() {
        println("Name: $name, Age: $age")
    }
}

ব্যাখ্যা:

  • Person হলো একটি ক্লাস যেখানে দুটি প্রোপার্টি (name এবং age) এবং একটি মেথড (displayInfo) আছে।
  • মেথডটি name এবং age প্রোপার্টিগুলো প্রিন্ট করে।

ii) ক্লাস থেকে অবজেক্ট তৈরি

একটি ক্লাস থেকে অবজেক্ট তৈরি করা হলে সেই ক্লাসের প্রোপার্টি এবং মেথডগুলো অবজেক্টের সাথে অ্যাক্সেস করা যায়।

উদাহরণ:

fun main() {
    val person = Person()
    person.name = "Alice"
    person.age = 25
    person.displayInfo() // আউটপুট: Name: Alice, Age: 25
}

ব্যাখ্যা:

  • Person() এর মাধ্যমে একটি নতুন অবজেক্ট তৈরি করা হয়েছে এবং সেটি person ভ্যারিয়েবলে অ্যাসাইন করা হয়েছে।
  • এরপর, অবজেক্টের প্রোপার্টি সেট করা হয়েছে এবং মেথড কল করে ইনফরমেশন প্রিন্ট করা হয়েছে।

২. কনস্ট্রাক্টর (Constructor)

কটলিনে ক্লাসে ডিফল্টভাবে একটি প্রাইমারি কনস্ট্রাক্টর থাকে যা প্রোপার্টিগুলো ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।

i) প্রাইমারি কনস্ট্রাক্টর

ক্লাসের সাথে সরাসরি প্রাইমারি কনস্ট্রাক্টর ডিক্লেয়ার করা যায়।

উদাহরণ:

class Person(val name: String, var age: Int) {
    fun displayInfo() {
        println("Name: $name, Age: $age")
    }
}

ব্যাখ্যা:

  • এখানে name এবং age প্রোপার্টি প্রাইমারি কনস্ট্রাক্টরের মধ্যে ডিক্লেয়ার করা হয়েছে।

ii) অবজেক্ট তৈরি করার সময় কনস্ট্রাক্টর ব্যবহার করা

fun main() {
    val person = Person("Bob", 30)
    person.displayInfo() // আউটপুট: Name: Bob, Age: 30
}

ব্যাখ্যা:

  • Person("Bob", 30) এর মাধ্যমে কনস্ট্রাক্টর কল করা হয়েছে এবং প্রোপার্টিগুলো ইনিশিয়ালাইজ করা হয়েছে।

৩. সেকেন্ডারি কনস্ট্রাক্টর

কটলিনে আপনি প্রাইমারি কনস্ট্রাক্টর ছাড়াও সেকেন্ডারি কনস্ট্রাক্টর ব্যবহার করতে পারেন। এটি তখন ব্যবহার করা হয় যখন আপনি ক্লাসের ভিন্ন ভিন্ন ইনিশিয়ালাইজেশন করতে চান।

উদাহরণ:

class Person {
    var name: String
    var age: Int

    // প্রাইমারি কনস্ট্রাক্টর নেই, তবে সেকেন্ডারি কনস্ট্রাক্টর আছে
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }

    fun displayInfo() {
        println("Name: $name, Age: $age")
    }
}

fun main() {
    val person = Person("Charlie", 28)
    person.displayInfo() // আউটপুট: Name: Charlie, Age: 28
}

ব্যাখ্যা:

  • এখানে constructor কীওয়ার্ড ব্যবহার করে সেকেন্ডারি কনস্ট্রাক্টর ডিক্লেয়ার করা হয়েছে, যেখানে প্রোপার্টিগুলো ইনিশিয়ালাইজ করা হয়েছে।

৪. ইনহেরিটেন্স (Inheritance)

কটলিনে ইনহেরিটেন্স ব্যবহার করে একটি ক্লাস অন্য ক্লাস থেকে প্রোপার্টি এবং মেথডগুলো ইনহেরিট করতে পারে।

উদাহরণ:

open class Animal(val name: String) {
    fun eat() {
        println("$name is eating.")
    }
}

class Dog(name: String, val breed: String) : Animal(name) {
    fun bark() {
        println("$name is barking.")
    }
}

fun main() {
    val dog = Dog("Max", "Labrador")
    dog.eat() // আউটপুট: Max is eating.
    dog.bark() // আউটপুট: Max is barking.
}

ব্যাখ্যা:

  • Animal হলো একটি ওপেন ক্লাস যা ইনহেরিট করা যাবে।
  • Dog ক্লাসটি Animal ক্লাসটি ইনহেরিট করছে এবং অতিরিক্ত একটি মেথড (bark) যোগ করছে।

৫. অবজেক্ট (Object)

কটলিনে অবজেক্ট হলো একটি নির্দিষ্ট ক্লাসের ইন্সট্যান্স। আপনি সরাসরি অবজেক্ট তৈরি করতে পারেন এবং এটি একটি সিঙ্গেলটন অবজেক্ট হতে পারে।

i) সিঙ্গেলটন অবজেক্ট

কটলিনে object কীওয়ার্ড ব্যবহার করে সিঙ্গেলটন অবজেক্ট তৈরি করা যায়।

উদাহরণ:

object Singleton {
    var counter: Int = 0

    fun increment() {
        counter++
    }
}

fun main() {
    Singleton.increment()
    Singleton.increment()
    println(Singleton.counter) // আউটপুট: 2
}

ব্যাখ্যা:

  • Singleton অবজেক্টে একটি প্রোপার্টি (counter) এবং একটি মেথড (increment) আছে।
  • এই অবজেক্টের মেথড কল করে আমরা ভ্যালু পরিবর্তন করতে পারি, যা একই রেফারেন্স থেকে অ্যাক্সেস করা হয়।

উপসংহার

কটলিনে Classes এবং Objects প্রোগ্রামের মূল কাঠামো তৈরি করতে ব্যবহৃত হয়। ক্লাসের মাধ্যমে আপনি প্রোপার্টি এবং মেথড ডিফাইন করতে পারেন, যা অবজেক্টের মাধ্যমে অ্যাক্সেস করা যায়। ইনহেরিটেন্স এবং কনস্ট্রাক্টর ব্যবহার করে আরও জটিল এবং পুনঃব্যবহারযোগ্য কোড তৈরি করা যায়। সিঙ্গেলটন অবজেক্ট তৈরি করেও একটি নির্দিষ্ট অবজেক্টকে শেয়ার করা যায়।

Content added By

Constructors এবং Initializers

324

Constructors এবং Initializers

কটলিনে Constructors এবং Initializers ব্যবহার করে ক্লাসের অবজেক্ট তৈরি এবং প্রাথমিক মান সেট করা হয়। কটলিনে দুটি ধরনের কন্সট্রাক্টর রয়েছে: Primary Constructor এবং Secondary Constructor। এছাড়া, Initializer Blocks ব্যবহার করে অবজেক্টের ইনিশিয়াল স্টেট সেট করা যায়। নিচে এই কনসেপ্টগুলো নিয়ে বিস্তারিত আলোচনা করা হলো:


১. Primary Constructor

কটলিনে প্রাইমারি কন্সট্রাক্টর হলো ক্লাসের প্রধান কন্সট্রাক্টর, যা ক্লাস ডিক্লারেশনের সাথে সরাসরি যুক্ত থাকে। প্রাইমারি কন্সট্রাক্টর সাধারণত প্রোপার্টিগুলো ইনিশিয়ালাইজ করার জন্য ব্যবহৃত হয়।

উদাহরণ:

class Person(val name: String, var age: Int)

ব্যাখ্যা:

  • এখানে Person ক্লাসের প্রাইমারি কন্সট্রাক্টর name এবং age নামে দুটি প্রোপার্টি গ্রহণ করে।
  • প্রাইমারি কন্সট্রাক্টর সরাসরি ক্লাস ডিক্লারেশনের সাথে সংযুক্ত থাকে এবং এতে বডি থাকে না।

প্রাইমারি কন্সট্রাক্টরের সাথে ইনিশিয়ালাইজেশন:

class Person(val name: String, var age: Int) {
    init {
        println("Person created with name: $name and age: $age")
    }
}

ব্যাখ্যা:

  • init ব্লক প্রাইমারি কন্সট্রাক্টরের সাথে সম্পর্কিত। যখন ক্লাসের অবজেক্ট তৈরি হয়, তখন init ব্লকের কোড এক্সিকিউট হয়।
  • এখানে, init ব্লকে প্রাথমিক মেসেজ প্রিন্ট করা হচ্ছে।

২. Secondary Constructor

কটলিনে সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করা হয় অতিরিক্ত ইনিশিয়ালাইজেশন লজিক প্রয়োগ করতে, যা প্রাইমারি কন্সট্রাক্টর দ্বারা সরাসরি সমাধান করা যায় না। একটি ক্লাসে একাধিক সেকেন্ডারি কন্সট্রাক্টর থাকতে পারে।

উদাহরণ:

class Person(val name: String) {
    var age: Int = 0

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }
}

ব্যাখ্যা:

  • এখানে Person ক্লাসের প্রাইমারি কন্সট্রাক্টর একটি প্যারামিটার (name) নেয়।
  • সেকেন্ডারি কন্সট্রাক্টর name এবং age নামে দুটি প্যারামিটার নেয়, এবং প্রাইমারি কন্সট্রাক্টরকে কল করে (: this(name)), তারপর age প্রোপার্টি সেট করে।

৩. Initializer Blocks

Initializer Block হলো একটি ব্লক যা প্রাইমারি কন্সট্রাক্টরের পরে এক্সিকিউট হয়। এটি ইনিশিয়ালাইজেশন লজিক প্রয়োগ করতে ব্যবহৃত হয়, যা প্রাইমারি কন্সট্রাক্টরের বাইরে রাখতে হয়।

উদাহরণ:

class Employee(val name: String, val salary: Double) {
    init {
        println("Employee name: $name, Salary: $salary")
    }
}

ব্যাখ্যা:

  • Employee ক্লাসের প্রাইমারি কন্সট্রাক্টরে দুটি প্রোপার্টি আছে: name এবং salary
  • init ব্লকটি অবজেক্ট তৈরি হলে ইনিশিয়ালাইজ হয় এবং প্রাথমিক মেসেজ প্রিন্ট করে।

বেশি ইনিশিয়ালাইজার ব্লক ব্যবহার:

class Product(val name: String, val price: Double) {
    init {
        println("Product created: $name")
    }

    init {
        println("Price: $price")
    }
}

ব্যাখ্যা:

  • একটি ক্লাসে একাধিক init ব্লক থাকতে পারে, এবং এগুলো উপরের ক্রম অনুযায়ী এক্সিকিউট হয়।

৪. প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টরের সমন্বয়

আপনি প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টর একসাথে ব্যবহার করে ক্লাসে আরও ফ্লেক্সিবল ইনিশিয়ালাইজেশন করতে পারেন।

উদাহরণ:

class Vehicle(val model: String) {
    var year: Int = 0

    init {
        println("Vehicle model: $model")
    }

    constructor(model: String, year: Int) : this(model) {
        this.year = year
        println("Vehicle year: $year")
    }
}

fun main() {
    val car1 = Vehicle("Toyota")
    val car2 = Vehicle("Honda", 2020)
}

ব্যাখ্যা:

  • এখানে Vehicle ক্লাসে একটি প্রাইমারি এবং একটি সেকেন্ডারি কন্সট্রাক্টর আছে।
  • car1 অবজেক্ট প্রাইমারি কন্সট্রাক্টর ব্যবহার করে তৈরি হয়েছে এবং শুধুমাত্র মডেল সেট হয়েছে।
  • car2 অবজেক্ট সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করে তৈরি হয়েছে এবং মডেল ও বছরের তথ্য সেট হয়েছে।

উপসংহার

কটলিনে Constructors এবং Initializers ব্যবহার করে ক্লাসের অবজেক্ট তৈরি করা এবং প্রাথমিক মান সেট করা খুবই সহজ এবং সংক্ষিপ্ত। প্রাইমারি কন্সট্রাক্টর সাধারণত সাধারণ এবং সরাসরি ইনিশিয়ালাইজেশন কাজ করে, যেখানে সেকেন্ডারি কন্সট্রাক্টর অতিরিক্ত লজিক প্রয়োগে সহায়ক। Initializer Blocks ব্যবহার করে আপনি আরও জটিল ইনিশিয়ালাইজেশন কাজ করতে পারেন।

Content added By

Inheritance এবং Polymorphism

306

Inheritance এবং Polymorphism

কটলিনে Inheritance এবং Polymorphism হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি প্রধান কনসেপ্ট। এগুলো ব্যবহার করে আপনি কোড পুনঃব্যবহারযোগ্য, সম্প্রসারণযোগ্য, এবং আরো ফ্লেক্সিবল করতে পারেন। নিচে Inheritance এবং Polymorphism নিয়ে বিস্তারিত আলোচনা করা হলো:


১. Inheritance (ইনহেরিটেন্স)

Inheritance হলো একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস অন্য একটি ক্লাসের প্রোপার্টি এবং মেথডগুলো ইনহেরিট করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোড পুনরায় ব্যবহার করতে পারেন এবং ক্লাসের কার্যকারিতা সম্প্রসারণ করতে পারেন।

i) কটলিনে ইনহেরিটেন্স

কটলিনে একটি ক্লাস ইনহেরিট করার জন্য বেস ক্লাসটিকে open কীওয়ার্ড দিয়ে চিহ্নিত করতে হয়। ডিফল্টভাবে, কটলিনে সব ক্লাস final, অর্থাৎ ইনহেরিট করা যায় না।

উদাহরণ:

open class Animal(val name: String) {
    fun eat() {
        println("$name is eating.")
    }
}

class Dog(name: String, val breed: String) : Animal(name) {
    fun bark() {
        println("$name is barking.")
    }
}

fun main() {
    val dog = Dog("Max", "Labrador")
    dog.eat() // আউটপুট: Max is eating.
    dog.bark() // আউটপুট: Max is barking.
}

ব্যাখ্যা:

  • Animal হলো একটি ওপেন ক্লাস যা ইনহেরিট করা যাবে। এটি একটি প্রোপার্টি (name) এবং একটি মেথড (eat) ধারণ করে।
  • Dog ক্লাসটি Animal ক্লাসটি ইনহেরিট করছে এবং একটি অতিরিক্ত প্রোপার্টি (breed) এবং একটি মেথড (bark) যোগ করছে।

ii) মেথড ওভাররাইডিং

কটলিনে বেস ক্লাসের মেথড ওভাররাইড করতে হলে বেস ক্লাসের মেথডটিকে open করতে হয় এবং ডেরাইভড ক্লাসে override কীওয়ার্ড ব্যবহার করতে হয়।

উদাহরণ:

open class Animal(val name: String) {
    open fun sound() {
        println("$name makes a sound.")
    }
}

class Cat(name: String) : Animal(name) {
    override fun sound() {
        println("$name meows.")
    }
}

fun main() {
    val cat = Cat("Whiskers")
    cat.sound() // আউটপুট: Whiskers meows.
}

ব্যাখ্যা:

  • sound মেথডটি Animal ক্লাসে ওপেন করা হয়েছে।
  • Cat ক্লাসে sound মেথডটি ওভাররাইড করা হয়েছে, ফলে একই মেথড ভিন্নভাবে কাজ করছে।

২. Polymorphism (পলিমরফিজম)

Polymorphism হলো একটি ধারণা যেখানে একটি মেথড বা অবজেক্ট একাধিক ফর্ম ধারণ করতে পারে। কটলিনে Polymorphism এর মাধ্যমে আপনি একই মেথডকে বিভিন্নভাবে ইমপ্লিমেন্ট করতে পারেন এবং ভিন্ন ভিন্ন ক্লাসে একই ইন্টারফেস বা বেস ক্লাস ব্যবহার করতে পারেন।

i) মেথড ওভাররাইডিং এবং পলিমরফিজম

মেথড ওভাররাইডিং Polymorphism এর একটি উদাহরণ যেখানে বেস ক্লাসের মেথড ডেরাইভড ক্লাসে ভিন্নভাবে কাজ করে।

উদাহরণ:

open class Animal {
    open fun makeSound() {
        println("Animal makes a sound")
    }
}

class Dog : Animal() {
    override fun makeSound() {
        println("Dog barks")
    }
}

class Cat : Animal() {
    override fun makeSound() {
        println("Cat meows")
    }
}

fun main() {
    val animals: List<Animal> = listOf(Dog(), Cat())
    for (animal in animals) {
        animal.makeSound()
    }
}

ব্যাখ্যা:

  • এখানে, Animal ক্লাসে makeSound মেথড ওপেন করা হয়েছে।
  • Dog এবং Cat ক্লাসে এটি ওভাররাইড করা হয়েছে।
  • animals লিস্টে ভিন্ন ভিন্ন টাইপের অবজেক্ট (Dog এবং Cat) রাখা হয়েছে, কিন্তু তারা সবাই Animal টাইপ হিসেবে চিহ্নিত।
  • Polymorphism এর মাধ্যমে একই makeSound মেথড বিভিন্ন ফর্ম ধারণ করছে।

ii) ইন্টারফেস ব্যবহার করে Polymorphism

ইন্টারফেস ব্যবহার করে আপনি একাধিক ক্লাসে একই মেথড ইমপ্লিমেন্ট করতে পারেন, যা Polymorphism এর আরও একটি উদাহরণ।

উদাহরণ:

interface Shape {
    fun draw()
}

class Circle : Shape {
    override fun draw() {
        println("Drawing a circle")
    }
}

class Rectangle : Shape {
    override fun draw() {
        println("Drawing a rectangle")
    }
}

fun main() {
    val shapes: List<Shape> = listOf(Circle(), Rectangle())
    for (shape in shapes) {
        shape.draw()
    }
}

ব্যাখ্যা:

  • Shape ইন্টারফেসে একটি মেথড draw ডিক্লেয়ার করা হয়েছে।
  • Circle এবং Rectangle ক্লাসে draw মেথড ইমপ্লিমেন্ট করা হয়েছে।
  • shapes লিস্টে Circle এবং Rectangle উভয়ই Shape টাইপ হিসেবে চিহ্নিত।
  • Polymorphism এর মাধ্যমে একই draw মেথড বিভিন্ন ফর্ম ধারণ করছে এবং প্রিন্ট করছে।

৩. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class)

কটলিনে অ্যাবস্ট্রাক্ট ক্লাসও ইনহেরিটেন্স এবং Polymorphism এর একটি উপায়। অ্যাবস্ট্রাক্ট ক্লাস এমন একটি ক্লাস যা ইন্সট্যান্স তৈরি করা যায় না এবং এটি কিছু অ্যাবস্ট্রাক্ট মেথড ধারণ করে যেগুলো ডেরাইভড ক্লাসে ইমপ্লিমেন্ট করতে হয়।

উদাহরণ:

abstract class Vehicle(val name: String) {
    abstract fun start()
}

class Car(name: String) : Vehicle(name) {
    override fun start() {
        println("$name is starting with a key.")
    }
}

class Bike(name: String) : Vehicle(name) {
    override fun start() {
        println("$name is starting with a kick.")
    }
}

fun main() {
    val car = Car("Toyota")
    val bike = Bike("Honda")
    
    car.start() // আউটপুট: Toyota is starting with a key.
    bike.start() // আউটপুট: Honda is starting with a kick.
}

ব্যাখ্যা:

  • Vehicle হলো একটি অ্যাবস্ট্রাক্ট ক্লাস যাতে একটি অ্যাবস্ট্রাক্ট মেথড start আছে।
  • Car এবং Bike ক্লাস এই অ্যাবস্ট্রাক্ট ক্লাসটি ইনহেরিট করে এবং start মেথড ইমপ্লিমেন্ট করে।

উপসংহার

কটলিনে Inheritance এবং Polymorphism কোডের পুনঃব্যবহারযোগ্যতা, সম্প্রসারণযোগ্যতা, এবং ফ্লেক্সিবিলিটি বাড়াতে সাহায্য করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোডের কার্যকারিতা বাড়াতে পারেন এবং Polymorphism এর মাধ্যমে একই মেথড বা ইন্টারফেসের বিভিন্ন ইমপ্লিমেন্টেশন তৈরি করতে পারেন।

Content added By

Abstract Classes এবং Interfaces

290

Abstract Classes এবং Interfaces

কটলিনে Abstract Classes এবং Interfaces ব্যবহার করে অ্যাবস্ট্রাকশন এবং ফ্লেক্সিবিলিটি আনা যায়। এদের মাধ্যমে আপনি কটলিনে মডুলার, রিইউজেবল এবং মেইনটেইনেবল কোড তৈরি করতে পারেন। এরা দুটোই অ্যাবস্ট্রাকশন তৈরি করতে ব্যবহৃত হলেও এদের মধ্যে কিছু পার্থক্য রয়েছে। নিচে এই দুইটি বিষয়ের উপর বিস্তারিত আলোচনা করা হলো।


১. Abstract Classes

Abstract Classes হলো এমন ক্লাস যেগুলো থেকে সরাসরি অবজেক্ট তৈরি করা যায় না। এগুলো সাধারণত কিছু সাধারণ প্রোপার্টি এবং মেথড ডিফাইন করে, যেগুলোকে সাবক্লাসে ওভাররাইড করে ইমপ্লিমেন্ট করতে হয়। কটলিনে abstract কীওয়ার্ড ব্যবহার করে একটি ক্লাস এবং মেথডকে অ্যাবস্ট্রাক্ট করা হয়।

Abstract Class উদাহরণ:

abstract class Animal {
    abstract val name: String

    abstract fun sound()

    fun eat() {
        println("$name is eating.")
    }
}

class Dog : Animal() {
    override val name: String = "Dog"

    override fun sound() {
        println("Bark")
    }
}

ব্যাখ্যা:

  • Animal হলো একটি abstract ক্লাস যা একটি abstract প্রোপার্টি (name) এবং একটি abstract মেথড (sound()) ধারণ করে।
  • eat() হলো একটি সাধারণ মেথড যা ইমপ্লিমেন্ট করা হয়েছে এবং এটি সকল সাবক্লাসে ব্যবহৃত হতে পারে।
  • Dog ক্লাসটি Animal থেকে ইনহেরিট করে এবং name এবং sound() মেথড ইমপ্লিমেন্ট করে।

Abstract Class ব্যবহার কেন?

  • যখন কিছু সাধারণ ফাংশনালিটি (যেমন: eat()) সব সাবক্লাসে শেয়ার করতে হয়, কিন্তু কিছু নির্দিষ্ট ফাংশনালিটি (যেমন: sound()) প্রতিটি সাবক্লাসে আলাদা ভাবে ইমপ্লিমেন্ট করতে হয়।
  • অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে হলে কটলিনে সাবক্লাসগুলোকে open করতে হয় না, কারণ অ্যাবস্ট্রাক্ট ক্লাস ডিফল্টভাবে open থাকে।

২. Interfaces

Interfaces হলো এমন এক ধরনের ব্লুপ্রিন্ট যা শুধুমাত্র ফাংশনালিটি ঘোষণা করে। এটি ক্লাস বা অবজেক্টকে নির্দিষ্ট ফাংশনালিটি ইমপ্লিমেন্ট করতে বাধ্য করে। কটলিনে interface কীওয়ার্ড ব্যবহার করে ইন্টারফেস ডিক্লেয়ার করা হয়। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, যা মাল্টিপল ইনহেরিটেন্সের মতো কাজ করে।

Interface উদাহরণ:

interface Animal {
    val name: String

    fun sound()

    fun eat() {
        println("$name is eating.")
    }
}

class Cat : Animal {
    override val name: String = "Cat"

    override fun sound() {
        println("Meow")
    }
}

ব্যাখ্যা:

  • Animal হলো একটি ইন্টারফেস যা একটি প্রোপার্টি (name), একটি ফাংশন (sound()), এবং একটি ডিফল্ট ফাংশন (eat()) ডিফাইন করে।
  • Cat ক্লাসটি Animal ইন্টারফেস ইমপ্লিমেন্ট করে এবং এতে থাকা প্রোপার্টি এবং মেথডগুলো ওভাররাইড করে।

Interface ব্যবহার কেন?

  • যখন আপনি চান একটি ক্লাস একাধিক ফাংশনালিটি ইমপ্লিমেন্ট করুক। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, কিন্তু একাধিক ক্লাস ইনহেরিট করতে পারে না।
  • ইন্টারফেসে ডিফল্ট মেথডও থাকতে পারে যা প্রয়োজন অনুযায়ী ওভাররাইড করা যায়।

মাল্টিপল ইন্টারফেস ইমপ্লিমেন্ট করা:

interface Animal {
    fun sound()
}

interface Pet {
    fun play()
}

class Bird : Animal, Pet {
    override fun sound() {
        println("Chirp")
    }

    override fun play() {
        println("Bird is playing")
    }
}
  • Bird ক্লাসটি Animal এবং Pet দুটি ইন্টারফেস ইমপ্লিমেন্ট করছে এবং তাদের মেথডগুলো ওভাররাইড করেছে।

Abstract Classes এবং Interfaces-এর পার্থক্য

ফিচারAbstract ClassInterface
ইনস্ট্যান্স তৈরিইনস্ট্যান্স তৈরি করা যায় নাইনস্ট্যান্স তৈরি করা যায় না
মাল্টিপল ইনহেরিটেন্সএকটি ক্লাস একাধিক অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে পারে নাএকটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে
প্রোপার্টিপ্রোপার্টি হোল্ড করতে পারেশুধুমাত্র অ্যাবস্ট্রাক্ট প্রোপার্টি ঘোষণা করতে পারে
কন্সট্রাক্টরকন্সট্রাক্টর থাকতে পারেকন্সট্রাক্টর থাকতে পারে না
মেথডঅ্যাবস্ট্রাক্ট এবং নন-অ্যাবস্ট্রাক্ট মেথড থাকতে পারেশুধুমাত্র অ্যাবস্ট্রাক্ট এবং ডিফল্ট মেথড থাকতে পারে

উপসংহার

কটলিনে Abstract Classes এবং Interfaces অ্যাবস্ট্রাকশন এবং মডুলারিটি নিশ্চিত করতে সাহায্য করে। এগুলো ব্যবহার করে আপনি ক্লাসের মধ্যে সাধারণ ফাংশনালিটি শেয়ার করতে পারেন এবং একই সাথে নির্দিষ্ট ফাংশনালিটি প্রতিটি সাবক্লাস বা ইমপ্লিমেন্টিং ক্লাসে আলাদাভাবে তৈরি করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...